/*
 *    This program is free software; you can redistribute it and/or modify
 *    it under the terms of the GNU General Public License as published by
 *    the Free Software Foundation; either version 2 of the License, or
 *    (at your option) any later version.
 *
 *    This program is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *    GNU General Public License for more details.
 *
 *    You should have received a copy of the GNU General Public License
 *    along with this program; if not, write to the Free Software
 *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *    2010 year
 *    Author: Michael Khromov aka MikeDM (Mike D'Morto)
 *    E-Mail: mikedmorto@gmail.com
 */
#include "tspl_login_std_mng.h"
#include "def.h"

bool Tspl_login_std_mng::qinit(const QString &cfgstr, const QString & curruser, const QString & filebase,QList<TsIfaceWrkPlugin*> * pllist){
    // принимаем строку параметров.
    // разбиваем на параметры
    emit this->sigPutLog(PLUGIN_NAME,3,"Debug: parse parameters");
    QStringList pr=cfgstr.split(",");
    for(int i = 0; i < pr.size(); i++){
        emit this->sigPutLog(PLUGIN_NAME,3,"Debug: parameter "+QString::number(i)+"="+pr.at(i));
        if(QString(pr.at(i)).split("=").at(0)=="type"){
            // нашли в конфиге тип диалога.
            if(QString(pr.at(i)).split("=").at(1) == "user"){
                this->all=false;
            }else{
                if(QString(pr.at(i)).split("=").at(1) == "all"){
                    this->all=true;
                }else{
                    // ошибочный параметр. тушим инициализацию
                    return false;
                }
            }

        }
    }

    // создаем диалоги и связываем с собой.
    // важно! каждый плагин создает свои диалоги во время инициализации.
    // а вот уже диалоги от этих диалогов как хотят.
    dia = new DLoginStdMng();
    connect(dia,SIGNAL(sigTestUP(QString)),SLOT(slotTestUP(QString)));
    connect(this,SIGNAL(sigCurrUP(bool)),dia,SLOT(slotTestUP(bool)));
    connect(dia,SIGNAL(sigChangeUP(QString)),SLOT(slotChangeUP(QString)));
    connect(this,SIGNAL(sigChangeUP(bool)),dia,SLOT(slotChangeUP(bool)));
    connect(dia,SIGNAL(sigGetAllUsers()),this,SLOT(slotGetAllUsers()));

    this->mcurruser=curruser;
    return true;
}

bool Tspl_login_std_mng::qstart(){

    return dia->dstart(this->all,this->mcurruser);
}

void Tspl_login_std_mng::slotDb(const QString &plName, int id,  QSqlQuery *ret){

    if(plName==PLUGIN_NAME){
        if(!this->all){
            this->id=id;
            switch(this->step){
            case Tspl_login_std_mng::ValidateUCP :
                // пришел ответ на запрос валидации пароля текущего пользователя в режиме юзера
                ret->next();
                //qDebug()<<"ret "<<ret->value(0).toBool();
                // сообщаем диалогу что вернула база
                emit this->sigCurrUP(ret->value(0).toBool());
                emit this->sigClear(this->id);
                break;
            case Tspl_login_std_mng::ChangeUCP :
                // если сработал этот слот в этом режиме, значит запрос выполнился
                // в противном случае сработал бы слот ошибки.
                emit this->sigChangeUP(true);
                break;
            default:
                break;
            }
        }else{
            qDebug()<<"ALL";
            while(ret->next()){
                qDebug()<<ret->value(0).toString();
            }
        }
    }
}

void Tspl_login_std_mng::slotDbErr(const QString &plName, const QString &errtext){
    qDebug()<<"FIX ERROR";
}

QString Tspl_login_std_mng::getName(){
    return tr("standart login managment");
}

void Tspl_login_std_mng::slotTestUP(const QString &pass){
    // диалог в режиме пользователя, запросил соответствие пароля текущего пользователя.
    // необходимо сунуться в бд за сим добром.
    QList<QVariant> aa;
    aa.append(this->mcurruser);
    aa.append(pass);
    // устанавливаем переключатель состояния в режим запроса валидации пользовательского пароля
    // в юзер режиме
    this->step=Tspl_login_std_mng::ValidateUCP;
    emit this->sigQexec(PLUGIN_NAME,"validate_userpass",aa);

}

void Tspl_login_std_mng::slotChangeUP(const QString &pass){
    // диалог в режиме пользователя, запросили смену пароля на переданный.
    // ныряем в бд.
    QList<QVariant> aa;
    aa.append(pass);
    aa.append(this->mcurruser);
    // устанавливаем переключатель состояния в режим смены пароля.
    // в юзер режиме
    this->step=Tspl_login_std_mng::ChangeUCP;
    emit this->sigQexec(PLUGIN_NAME,"change_userpass",aa);
}

void Tspl_login_std_mng::slotGetAllUsers(){
    QList<QVariant> aa;
    emit this->sigQexec(PLUGIN_NAME,"get_all_users",aa);
}

// синхронный режим. в стандартном исполнении он не нужен. но может пригодиться.
// так что здесь просто заглушко
void Tspl_login_std_mng::slotRstartS(const QString pl_name){}
// ответ положительный с данными по запросу.
void Tspl_login_std_mng::slotFinishS(const QString & plName , QSqlQuery * ret){}
// ответ отрицательный с данными по ошибке
void Tspl_login_std_mng::slotFinishErrS(const QString & plName , const QString & errtext){}



Q_EXPORT_PLUGIN2(TsIfaceWrkPlugin,Tspl_login_std_mng)
